const child_process = require("child_process");
const os = require("os");
const fs = require("fs");

// 执行一行cmd命令
function cmd(text) {
  const encoding = "cp936";
  const binaryEncoding = "binary";

  return new Promise(async (resolve, reject) => {
    // 判断是否使用了nvm，将环境变量追加到指令之前
    const NVM_DIR = `${os.homedir()}/.nvm`;
    if (await exiteDir(NVM_DIR)) {
      text = `[ -s "${NVM_DIR}/nvm.sh" ] &&. "${NVM_DIR}/nvm.sh" && ` + text;
    }

    child_process.exec(
      text,
      { encoding: binaryEncoding },
      (err = "", stdout = "", stderr) => {
        if (err) {
          resolve({
            res: err,
            type: "error",
          });
          return;
        }
        resolve({
          res: stdout,
          type: "success",
        });
      }
    );
  });
}

// 校验文件夹/文件是否存在
function exiteDir(dirPath) {
  return new Promise((resolve, reject) => {
    // 检查文件夹是否存在
    fs.access(dirPath, fs.constants.F_OK, (err) => {
      if (err) {
        resolve(false);
        return;
      }
      resolve(true);
    });
  });
}

function sleep(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

/**
 * 检查文件类型
 * @param {*} path
 * @returns
 */
function checkTypeSync(path) {
  let type = ""; // 1 文件 2 文件夹 3 其他
  try {
    const stats = fs.statSync(path);
    if (stats.isFile()) {
      // console.log("这是一个文件");
      type = "1";
    } else if (stats.isDirectory()) {
      // console.log("这是一个文件夹");
      type = "2";
    } else {
      // console.log("这不是一个文件或文件夹");
      type = "3";
    }
  } catch (err) {
    console.error("发生错误:", err);
  }
  return type;
}

module.exports = {
  cmd,
  exiteDir,
  sleep,
  checkTypeSync,
};
